package com.huiyun.project.pay.biz.handler.callback;

import com.ijpay.core.enums.SignType;
import com.ijpay.core.kit.PayKit;
import com.ijpay.core.kit.WxPayKit;
import com.ijpay.wxpay.WxPayApiConfig;
import com.ijpay.wxpay.WxPayApiConfigKit;
import com.huiyun.project.pay.client.vo.NotifyResp;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.Assert;

import java.util.HashMap;
import java.util.Map;

/**
 * @FileName: NoticCallbackService
 * @Description: 接受消息通知 处理
 * 支付通知
 * @Author linjie
 * @Date 2018/11/8下午4:50
 * @Version 4.0.0
 */
@Slf4j
public abstract class ICallbackHandler {
    /**
     * 退款通知的具体参数key
     */
    protected static final String WX_PAY_REQ_INFO = "req_info";
    /**
     * 通知的code
     */
    protected static final String WX_PAY_RETURN_CODE = "return_code";

    /**
     * 通知的msg
     */
    protected static final String WX_PAY_RETURN_MSG = "return_msg";
    /**
     * 退款通知业务成功,失败的code
     */
    protected static final String WX_PAY_RESULT_CODE = "result_code";



    /**
     * 解析通知消息 并验签
     * setp1
     *
     * @return 验签失败 /找不到对应的支付产品/解析失败 返回null
     */
    public Map<String, String> parseAndVerify(String channelAppId,String channelId, String xmlMsg) {
        log.debug("微信支付结果解析验证开始");
        Map<String, String> params=new HashMap<>();
        if (channelId.indexOf("WX_") != -1) {
            WxPayApiConfig wxPayApiConfig = WxPayApiConfigKit.getApiConfig(channelAppId);
            Assert.notNull(wxPayApiConfig, "无效的支付商户信息");
            params = PayKit.xmlToMap(xmlMsg);
            // 注意此处签名方式需与统一下单的签名类型一致
            Assert.isTrue(WxPayKit.verifyNotify(params, wxPayApiConfig.getPartnerKey(), SignType.HMACSHA256), "notify verify error");
        } else if (channelId.indexOf("ALI_") != -1) {

        }
        return params;
    }

    /**
     * 持久化消息存储(存在就不存储) 必须实现
     * 用于存储消息 并验证是否重复通知   判断重复通知条件: 同一个支付产品同一个 key
     * 在支付成功的情况下 同一个支付产品不可能存在相同key
     *
     * @return int=1 新消息 0已存储   返回1时执行下面流程
     */
    public abstract void saveNotifyIfNotExist(NotifyResp notifyResp);

    /**
     * 修改消息处理状态
     * 用于定时处理 线程处理失败的通知
     *
     * @param status 状态
     * @return 返回修改成功和失败
     * @author tiger
     */

    public abstract Boolean updateNotify(String mchId, String mchOrderNo, Integer status, String result);

    /*
     * 业务处理(异步处理)
     * 返回 订单id
     */
    public abstract void  process(NotifyResp notifyResp);


}
